
#include "curvacompuesta.h"
#include <cassert>
#include <iostream>

const Curva* CurvaCompuesta::selectCurva(float i, float &u) const {
   assert(not curvas.empty());

   size_t j = int(i * curvas.size());
   if(j >= curvas.size()) j = curvas.size() - 1;

   u = (i * curvas.size()) - j;
   return curvas[j];
}

void CurvaCompuesta::juntar(Curva &curva) {
   curvas.push_back(&curva);
}

Coord CurvaCompuesta::operator()(float i) const {
   float u;
   return selectCurva(i, u)->operator()(u);
}

/*
 * Nota:
 *    No hay interpolacion de tangentes entre los puntos de union
 *    de dos o mas curvas.
 * */
Coord CurvaCompuesta::tangente(float i) const {
   float u;
   return selectCurva(i, u)->tangente(u);
}

/*
 * Es el promedio de los centros de las curvas.
 *
 * */
//Nota: Orden lineal
Coord CurvaCompuesta::centro() const {
   Coord c;
   for(std::vector<const Curva*>::const_iterator it = curvas.begin();
         it != curvas.end(); ++it) {
      c += (*it)->centro();
   }

   return c * (1.0 / curvas.size());
}

/*
 * Es el maximo de los grados de las curvas.
 *
 * */
//Nota: Orden lineal
size_t CurvaCompuesta::grado() const {
   size_t g = 0;
   for(std::vector<const Curva*>::const_iterator it = curvas.begin();
         it != curvas.end(); ++it) {
      g = (g > (*it)->grado()) ? (*it)->grado() : g;
   }

   return g;
}

